#ifndef PACIENT_H
#define PACIENT_H

#include <QObject>
#include <QDate>
#include <QVariantList>
#include <QDebug>

#include "logger.h"

/* - - -
 | Клас Pacient що містить інформацію про пацієнта
 * - - - */

class QStandardItemModel; // для операцій і оглядів

class Pacient : public QObject
{
    Q_OBJECT
public:
    // конструктори
    Pacient();
    Pacient(const QString& fName, const QString& mName, const QString& lName,
            const QDate& dob, const QString& sex);
    ~Pacient();

    double ageAtDate(const QDate& date);

    void setFromVariantList(const QVariantList &vl);

public slots:
    void setFName(const QString& fName)
        { mFName = fName; }
    QString fName() const
        { return mFName; }
    void setMName(const QString& mName)
        { mMName = mName; }
    QString mName() const
        { return mMName; }
    void setLName(const QString& lName)
        { mLName = lName; }
    QString lName() const
        { return mLName; }
    void setDob(const QDate& date)
        { mDob = date; }
    QDate dob() const
        { return mDob; }
    void setSex(const QString& sex)
        { mSex = sex; }
    QString sex() const
        { return mSex; }
    void setComment(const QString& comment)
        { mComment= comment; }
    QString comment() const
        { return mComment; }

    QString foto() const
    { return mFotoPath; }
    void setFoto(const QString& fotoPath)
    { mFotoPath = fotoPath; }

    void setHFather(const double h)
        { mHFather = h; }
    void setHFather(const QString& h)
        { mHFather = h.toDouble(); }
    double hFather()
        { return mHFather; }
    void setHMother(const double h)
        { mHMother = h; }
    void setHMother(const QString& h)
        { mHMother = h.toDouble(); }
    double hMother()
        { return mHMother; }

    void setBloodType(const int t)
    { mBlood.first = t; }
    void setBloodRh(const int t)
    { mBlood.second = t; }

    void setRegion(const int i)
    { mRegion = i; }
    void setTown(const QString& town)
    { mTown = town; }

    void setSmoke(const bool t)
    { mSmoke = t; }
    void setAlko(const bool t)
    { mAlko = t; }
    void setNarco(const bool t)
    { mNarco = t; }


public:
    // ф-ії що стосуються операцій
    void addOperation(const QVariantList &newOperation );
    int operationsCount() const;                             // отримати к-ть оп.
    QStandardItemModel* operations();

    // ф-ії що стосуються обстежень
    void addInspection(const QVariantList &newInspection );  // додати обст. до переліку обст.
    int inspectionsCount() const;                            // отримати к-ть обст.
    QStandardItemModel* inspections();

    // ф-ії що стосуються рентгенів
    void addRentgen( QVariantList& newRentgen );
    int rentgensCount() const;
    QStandardItemModel* rentgens();

    // ф-ії по збереженню в xml
    bool saveToXml(const QString& path);

    bool saveToHtml(const QString& path);
    QString genHtmlInspections() const;
    QString genHtmlOperations() const;
    QString genHtmlRentgens() const;
    QString genHtml() const;

    QString fullName() const;

    QPair<int, int> mBlood; // first -- type, second -- rh
    int mRegion;
    QString mTown;

    // TODO: refactor it
    bool mSmoke, mAlko, mNarco;
private:
    int id;
    QString mFName;
    QString mMName;
    QString mLName;
    QString mSex;
    QString mComment;
    QString mFotoPath;
    QDate   mDob;          // дата народження

    double mHFather;
    double mHMother;

    QStandardItemModel *mOperationsModel;
    QStandardItemModel *mInspectionsModel;
    QStandardItemModel *mRentgensModel;

    void createAndSetupModels();
};

#endif // PACIENT_H
